<?php
/**
 * Created by PhpStorm.
 * User: guokunsheng
 * Date: 2018/6/5
 * Time: 16:44
 */

namespace app\common\lib;

use think\Cache;
use think\Env;
use think\Log;

/**
 * Iauth相关
 * Class IAuth
 */
class IAuth
{
    /**
     * 设置密码
     * @param string $data
     * @return string
     */
    public static function setPassword($data)
    {
        return md5($data . config('app.password_pre_halt'));
    }

    /**
     * 生成每次请求的sign
     * @param array $data
     * @return string
     */
    public static function setSign($data = [], $type = 'app')
    {
        // 1 按字段排序
        ksort($data);
//        var_dump($data);
        // 2拼接字符串数据  &
        $string = http_build_query($data);
//        var_dump($string);
        // 3通过aes来加密
        $string = (new Aes())->encryptWithOpenssl($string, $type);

        return $string;
    }

    /**
     * 检查sign是否正常
     * @param array $data
     * @param string $type app|live_app
     * @return boolean
     */
    public static function checkSignPass($data = [], $type = 'app')
    {
        $str = (new Aes())->decryptWithOpenssl($data['sign'], $type);

        if (empty($str)) return false;

        parse_str($str, $arr);

        try
        {
            $clientInfo = 'app-type: ' . $data['app-type'] . '&model: ' . $data['model'] . '&phone-version: ' . $data['phone-version'] . '&version: ' . $data['version'] . '&did=' . $data['did'];
        }
        catch (\Exception $e)
        {
//            Log::write('Client Info Error = ' . json_encode($data, true));
        }

        // 临时更换 did验证
        if (!is_array($arr)
//            || !isset($arr['did']) || $arr['did'] !== $data['did']
            || !isset($arr['version']) || $arr['version'] !== $data['version']
            || (($data['app-type'] !== 'android' || $data['version'] !== '1.9.8') && (!isset($arr['did']) || $arr['did'] !== $data['did']))
        )
        {
            return false;
        }

//        if (!config('app_debug'))
//        {
//            // IOS为10位时间戳 如：1585040793
//            if (strtolower($arr['app-type']) === 'ios')
//            {
//                $time = (int)($arr['time']);
//            } elseif (strlen($arr['time']) === 13)
//            {
//                $time = ceil((int)($arr['time']) / 1000);
//            } else
//            {
//                // Android新版为时间字符串 如：20200324170055
//                $dateTime = substr($arr['time'], 0, 4) . '-' . substr($arr['time'], 4, 2) . '-' . substr($arr['time'], 6, 2)
//                    . ' ' . substr($arr['time'], 8, 2) . ':' . substr($arr['time'], 10, 2) . ':' . substr($arr['time'], 12, 2);
//
//                $time = strtotime($dateTime);
////                $time = strtotime($arr['time']);
//            }
//
//            $valid = ((int)config('app.app_sign_time')) ?: 3600;
//
//            $timeDiff = time() - $time;
//            if ($timeDiff > $valid)
//            {
//                $log = '接口时效性校验参数：overtime=' . $timeDiff;
//                $hostName = Env::get('host.name') ?: 'local';
//                $title = $hostName . '异常请求 ';
//                $msg = '##  ' . $hostName . '接口签名时间校验异常';
//                $msg .= "\r\n > 签名失效:该签名已生成" . $timeDiff . '秒超过' . $valid . '秒' . PHP_EOL;
//                $msg .= "\r\n > 请求地址:" . request()->url() . PHP_EOL;
//                foreach ($data as $k => $d)
//                {
//                    if (in_array($k, ['user-agent', 'did', 'version', 'app-type', 'access-token', 'time', 'model', 'channel', 'phone-version'], true))
//                    {
//                        if ($k === 'access-token')
//                        {
//                            $accessUserToken = (new Aes())->decryptWithOpenssl($d);
//                            [$token, $id] = explode('||', $accessUserToken);
//                            $id = (int)($id);
//
//                            $msg .= "\r\n > uid：" . $id . PHP_EOL;
//                            $msg .= "\r\n > token：" . $token . PHP_EOL;
//
//                            $log .= '&uid=' . $id . '&token=' . $token;
//                        } else
//                        {
//                            $msg .= "\r\n > " . $k . '：' . $d . PHP_EOL;
//                            $log .= '&' . $k . '=' . $d;
//                        }
//                    }
//                }
//                // 钉钉通知地址
//                $ding_url = 'https://oapi.dingtalk.com/robot/send?access_token=1e3de0bf61223522507656dac05af0880ed212eb5fc9fe964b9df21e27a22a62';
//                try
//                {
//                    Util::sendDingMsg($ding_url, $title, $msg);
//                }
//                catch (\Exception $e)
//                {
//                    $log .= $e->getMessage();
//                }
//                Log::write($log, 'error', true);
////                return false;
//            }
////
////            $valid = (int)(config('app.app_sign_time'));
////            // 判断当前签名sign是否已过期
////            if ((time() - $time) > $valid)
////            {
////                return false;
////            }
////            // 唯一性判定 当前签名只能使用一次 Redis存储中获取
////            if (Cache::get($data['sign'])) return false;
//        }
        return true;
    }

    /**
     * 设置登录的token  - 唯一性的
     * @param string $tel
     * @return string
     */
    public static function setAppLoginToken($tel = '')
    {
        $str = md5(uniqid(md5(microtime(true)), true));
        $str = sha1($str . $tel);
        return $str;
    }

}
